import requests  # 导入requests库，用于发送HTTP请求
import json  # 导入json库，用于处理JSON数据


def get_kw_headers():
    """
    获取酷我音乐搜索所需的请求头信息。
    返回:
        dict: 包含User-Agent、Referer和Content-Type的字典
    """
    return {
        "User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/119.0.0.0 Safari/537.36",
        "Referer": "https://www.kuwo.cn/",
        "Content-Type": "application/json"
    }


def save_to_json(data, filename='news.json'):
    """
    将数据保存为JSON文件。

    参数:
        data (dict or list): 要保存的数据
        filename (str): 保存的文件名，默认为'news.json'
    """
    try:
        with open(filename, 'w', encoding='utf-8') as f:
            # 使用json.dump将数据写入文件，ensure_ascii=False确保中文字符正常显示，indent=4使JSON格式化更美观
            json.dump(data, f, ensure_ascii=False, indent=4)
        print(f"数据已成功保存到 {filename}")
    except IOError as e:
        # 捕获文件操作中的IO错误并打印错误信息
        print(f"保存文件失败: {e}")


def search_music(keyword, page=1, rn=30):
    """
    根据关键词搜索酷我音乐的歌词，并返回指定页码和数量的结果，仅搜索歌词。
    参数:
        keyword (str): 搜索的关键词，如歌手名、歌曲名等
        page (int): 页码，默认为第1页
        rn (int): 每页返回的结果数量，默认为30条
    返回:
        list: 包含搜索结果的列表，如果请求失败则返回None
    """
    # 酷我音乐搜索音乐的URL
    url = 'https://www.kuwo.cn/search/searchMusicBykeyWord?vipver=1&client=kt&ft=music&cluster=0&strategy=2012&encoding=utf8&rformat=json&mobi=1&issubtitle=1&show_copyright_off=1'

    # 请求参数，包括搜索关键词、页码和每页结果数量
    params = {
        "all": keyword,  # 搜索关键词，使用'all'字段表示全字段搜索
        "pn": page,  # 页码
        "rn": rn  # 每页结果数量
    }

    # 发送GET请求，附带请求头和参数
    resp = requests.get(url, headers=get_kw_headers(), params=params)

    # 检查响应状态码是否为200（表示请求成功）
    if resp.status_code == 200:
        try:
            # 解析响应的JSON数据
            data = resp.json()
            # 从解析后的数据中提取'abslist'字段，该字段包含搜索结果的列表
            abslist = data.get("abslist", [])
            return abslist
        except json.JSONDecodeError:
            # 如果JSON解析失败，打印错误信息并返回None
            print("响应数据不是有效的JSON格式")
            return None
    else:
        # 如果请求不成功，打印状态码和错误信息
        print(f"请求失败，状态码: {resp.status_code}")
        return None

if __name__ == "__main__":
    """
    主程序入口，执行搜索音乐并保存结果到JSON文件的操作。
    """
    # 调用search_music函数，搜索关键词'周杰伦'，第2页，每页10条结果
    data = search_music('周杰伦', 1, 10)

    # 检查data是否为None，避免在保存时出现AttributeError
    if data is not None:
        # 调用save_to_json函数，将搜索结果保存到'news.json'文件中
        save_to_json(data)
    else:
        print("未获取到有效的搜索数据，无法保存。")